www.gusucode.com > Weighted Differential Evolution Algorithm (WDE) > Weighted Differential Evolution Algorithm (WDE)/cc_wde/affine_transform/my_affine_transform.m

    %{

% problem : Geometric Optimization ; Evolutionary-Adjustment based Coordinate Transformation by using Affine-Model

load('affine_data.mat')
a=mydata.a; b=mydata.b


% unbounded search gives more accurate results !
algo_wde('my_affine_transform',mydata, 5, 4,  [0 0 0 0], [2*pi 1 1 1], 50000);

[out,t,x0,y0,b0] = my_affine_transform(globalminimizer,mydata);
% b0 is transfered-a data  into b-system

err=b0-b;

mse(err)



%}



function [out,t,x0,y0,A_transformed_to_B] = my_affine_transform(X,mydata)

A = mydata.a; % xyz
B = mydata.b; % xyz

n = size(X,1);
out = rand(n,1);

for i = 1:n
    
    sol = X(i,:);
    
    t = sol(1);
    lambda1 = sol(2);
    a = lambda1 * sin(t);
    b = lambda1 * cos(t);
      
    x0  = sol(3);  % dX
    y0  = sol(4);  % dY
    
    r = [ a  -b  0;
        b   a  0;
        0   0  1 ]; % ref : https://www.mathworks.com/help/phased/ref/rotz.html?requestedDomain=true
    
    t = atan(b/a)*180/pi; % returns the numerical value of rotation angle around the z-axis in right-hand system.
    
    % rotate % translate
    A_transformed_to_B = A * r ;  %  transform A -> B
    
    A_transformed_to_B(:,1) = A_transformed_to_B(:,1) + x0;
    A_transformed_to_B(:,2) = A_transformed_to_B(:,2) + y0;
    
    err =  abs( A_transformed_to_B(:,1:2) - B(:,1:2) );
    
    out(i) =  sum(err(:));  % MAE
    
    
end